home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Sprite 1984 - 1993
/
Sprite 1984 - 1993.iso
/
src
/
cmds
/
fsinstall
/
RCS
/
diskFragIO.c,v
< prev
next >
Wrap
Text File
|
1990-01-31
|
5KB
|
171 lines
head 1.1;
branch ;
access ;
symbols ;
locks ; strict;
comment @ * @;
1.1
date 90.01.31.13.53.44; author shirriff; state Exp;
branches ;
next ;
desc
@File as of 1-31-90, before replaced by symbolic link.
@
1.1
log
@Initial revision
@
text
@/*
* fragIO.c --
*
* Routines to allow fragments to be read and written.
*
* Copyright (C) 1986 Regents of the University of California
* All rights reserved.
*/
#ifndef lint
static char rcsid[] = "$Header: /sprite/src/lib/c/disk/RCS/diskFragIO.c,v 1.4 89/10/02 23:17:55 jhh Exp $ SPRITE (Berkeley)";
#endif not lint
#include "diskUtils.h"
#include <stdio.h>
#define SECTORS_PER_FRAG (FS_FRAGMENT_SIZE / DEV_BYTES_PER_SECTOR)
/*
*----------------------------------------------------------------------
*
* Disk_FragRead --
* Read fragments from the disk file at a specified 1K block offset.
* This has to use the disk geometry information to figure out
* what disk sectors correspond to the block.
*
* Results:
* 0 if could read the disk, -1 if could not. If couldn't read the disk
* then the error is stored in errno.
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
int
Disk_FragRead(openFileID, headerPtr, firstFrag, numFrags, buffer)
int openFileID; /* Handle on raw disk */
Fsdm_DomainHeader *headerPtr; /* Domain header with geometry
* information. */
int firstFrag; /* First frag to read */
int numFrags; /* The number of fragments to read */
Address buffer; /* The buffer to read into */
{
register Fsdm_Geometry *geoPtr;
register int cylinder;
register int rotationalSet;
register int blockNumber;
int sector;
geoPtr = &headerPtr->geometry;
blockNumber = firstFrag / FS_FRAGMENTS_PER_BLOCK;
cylinder = blockNumber / geoPtr->blocksPerCylinder;
if (geoPtr->rotSetsPerCyl > 0) {
/*
* Original mapping scheme using rotational sets.
*/
blockNumber -= cylinder * geoPtr->blocksPerCylinder;
rotationalSet = blockNumber / geoPtr->blocksPerRotSet;
blockNumber -= rotationalSet * geoPtr->blocksPerRotSet;
sector = geoPtr->sectorsPerTrack * geoPtr->numHeads * cylinder +
geoPtr->sectorsPerTrack * geoPtr->tracksPerRotSet *
rotationalSet + geoPtr->blockOffset[blockNumber];
sector += (firstFrag % FS_FRAGMENTS_PER_BLOCK) * SECTORS_PER_FRAG;
} else if (geoPtr->rotSetsPerCyl == FSDM_SCSI_MAPPING){
/*
* New mapping for scsi devices.
*/
sector = geoPtr->sectorsPerTrack * geoPtr->numHeads * cylinder +
firstFrag * SECTORS_PER_FRAG - cylinder *
geoPtr->blocksPerCylinder * DISK_SECTORS_PER_BLOCK;
} else {
return -1;
}
return(Disk_SectorRead(openFileID, sector,
numFrags * SECTORS_PER_FRAG, buffer));
}
/*
*----------------------------------------------------------------------
*
* Disk_FragWrite --
* Write fragments to the disk file at a specified 1K block offset.
* This has to use the disk geometry information to figure out
* what disk sectors correspond to the block.
*
* Results:
* 0 if could write the disk, -1 if could not. If couldn't write the
* disk then the error is stored in errno.
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
int
Disk_FragWrite(openFileID, headerPtr, firstFrag, numFrags, buffer)
int openFileID; /* Handle on raw disk */
Fsdm_DomainHeader *headerPtr; /* Domain header with geometry
information. */
int firstFrag; /* First frag to write */
int numFrags; /* The number of fragments to write */
Address buffer; /* The buffer to write out of. */
{
register Fsdm_Geometry *geoPtr;
register int cylinder;
register int rotationalSet;
register int blockNumber;
int sector;
geoPtr = &headerPtr->geometry;
blockNumber = firstFrag / FS_FRAGMENTS_PER_BLOCK;
cylinder = blockNumber / geoPtr->blocksPerCylinder;
if (geoPtr->rotSetsPerCyl > 0) {
/*
* Original mapping scheme using rotational sets.
*/
blockNumber -= cylinder * geoPtr->blocksPerCylinder;
rotationalSet = blockNumber / geoPtr->blocksPerRotSet;
blockNumber -= rotationalSet * geoPtr->blocksPerRotSet;
sector = geoPtr->sectorsPerTrack * geoPtr->numHeads * cylinder +
geoPtr->sectorsPerTrack * geoPtr->tracksPerRotSet *
rotationalSet + geoPtr->blockOffset[blockNumber];
sector += (firstFrag % FS_FRAGMENTS_PER_BLOCK) * SECTORS_PER_FRAG;
} else if (geoPtr->rotSetsPerCyl == FSDM_SCSI_MAPPING){
/*
* New mapping for scsi devices.
*/
sector = geoPtr->sectorsPerTrack * geoPtr->numHeads * cylinder +
firstFrag * SECTORS_PER_FRAG - cylinder *
geoPtr->blocksPerCylinder * DISK_SECTORS_PER_BLOCK;
} else {
return -1;
}
return(Disk_SectorWrite(openFileID, sector,
numFrags * SECTORS_PER_FRAG, buffer));
}
@